package com.midian.common.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

/**
 * 对象信息处理工具类
 * @author Mengfh
 *
 */
public class ObjUtils {
	
	private static final Logger LOG = Logger.getLogger(ObjUtils.class);

	/**
	 * 获取处理空信息后的值
	 * @param val 原来的值
	 * @return
	 */
	public static String getOpVal(Object val) {
		Object result = val;
		if(val == null || StringUtils.isBlank(String.valueOf(val))) {
			result = "";
		}
		return String.valueOf(result);
	}
	
	/**
	 * 根据目标集合，封装成Map（以目标对象某属性为key，拆分成多个小List）
	 * @param targetList 目标集合
	 * @param fieldName 目标Map的属性键值（目标对象的属性名称）
	 * @param fieldType 目标Map的属性类型
	 * @return
	 */
	public static <T, K> Map<T, List<T>> getTargetMap(List<T> targetList, String fieldName, Class<K> fieldType) {
		Map<K, T> parentMap = new HashMap<K, T>(); //父对象Map
		Map<K, List<T>> filterMap = new LinkedHashMap<K, List<T>>(); //过滤Map
		if(targetList != null && !targetList.isEmpty()) {
			for (T target : targetList) {
				//根据属性名，获取get方法名称
				String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
				try {
					//执行get方法获取key值
					K key = (K) target.getClass().getMethod(methodName).invoke(target);
					//如果该key的集合已保存，直接获取
					if(filterMap.containsKey(key)) {
						List<T> subList = filterMap.get(key);
						subList.add(target);
					} else {
					//如果该key的集合没保存，进行创建
						List<T> subList = new ArrayList<T>();
						subList.add(target);
						filterMap.put(key, subList); //保存子集
						parentMap.put(key, target); //保存父对象
					}
				} catch (Exception e) {
					LOG.error(e.getMessage());
				}
			}
		}
		Map<T, List<T>> targetMap = new LinkedHashMap<T, List<T>>();
		for(Entry<K, List<T>> entry : filterMap.entrySet()) {
			K key = entry.getKey();
			T parent = parentMap.get(key); //根据键值获取父对象
			List<T> subList = entry.getValue(); //获取子集
			targetMap.put(parent, subList);
		}
		return targetMap;
	}
}
